#include "mainface.h"
#include "ui_mainface.h"

#include <QString>
#include <QIcon>
#include <QPushButton>
#include <QDebug>
#include <QLineEdit>
#include <QSqlQuery>
#include <QSqlError>
#include <QBuffer>
#include <QMessageBox>


struct WidgetPrivate
{
    QSqlDatabase db;    // qt数据库对象
};

Mainface::Mainface(QWidget *parent,NetworkManager *networkManager) :
    QWidget(parent),
    networkManager(networkManager),
    ui(new Ui::Mainface),
    socket(new QTcpSocket(this))    // 初始化TCP套接字
{
    ui->setupUi(this);

    QIcon icon(":/icon/111.jpg");        // 设置程序的图标
    setWindowIcon(icon);

    setWindowTitle("教师端登录界面");      // 设置窗口标题

    ui->ID->setPlaceholderText("请输入账号");
    ui->passwd->setPlaceholderText("请输入密码");

    ui->passwd->setEchoMode(QLineEdit::Password);  // 将密码的输入框回显密码模式

    socket = networkManager->getSocket();       // 初始化 socket

    // 注册 登录 按钮点击事件
    connect(ui->logStuMes,&QPushButton::clicked,this,&Mainface::onLogButtonClicked);
    connect(ui->regis,&QPushButton::clicked,this,&Mainface::onResButtonClicked);

    // 连接服务器响应信号
    connect(socket,&QTcpSocket::readyRead,this,&Mainface::readServerResponse);

}

Mainface::~Mainface()
{
    delete ui;
}

// 注册按钮点击
void Mainface::onLogButtonClicked()
{
    // 获取ID和密码
    QString ID = ui->ID->text();
    QString passwd = ui->passwd->text();

    // 检查ID和密码是否为空
    if(ID.isEmpty() || passwd.isEmpty())
    {
        QMessageBox::warning(this,"Error","ID 和 passwd 不能为空!");
        return;
    }

    // 构造JSON数据
    QJsonObject jsonObj;
    jsonObj["type"] = LOGIN;
    jsonObj["ID"] = ID;
    jsonObj["passwd"] = passwd;

    // 将json对象转换为字节数组
    QJsonDocument jsonDoc(jsonObj);
    QByteArray data = jsonDoc.toJson(QJsonDocument::Compact);

    // 发送数据到服务器
    size_t dataSize = data.size();
    socket->write((const char *)&dataSize,sizeof(size_t));  // 先发送包头
    socket->write(data);                                    // 再发送json数据(包体)

    emit LoginBtnClicked();     // 发送注册信号
}

// 登录按钮点击
void Mainface::onResButtonClicked()
{
    // 获取ID和密码
    QString ID = ui->ID->text();
    QString passwd = ui->passwd->text();

    // 检查ID和密码是否为空
    if(ID.isEmpty() || passwd.isEmpty())
    {
        QMessageBox::warning(this,"Error","ID 和 passwd 不能为空!");
        return;
    }

    // 构造JSON数据
    QJsonObject jsonObj;
    jsonObj["type"] = REGIS;
    jsonObj["ID"] = ID;
    jsonObj["passwd"] = passwd;

    // 将json对象转换为字节数组
    QJsonDocument jsonDoc(jsonObj);
    QByteArray data = jsonDoc.toJson(QJsonDocument::Compact);

    // 发送数据到服务器
    size_t dataSize = data.size();
    socket->write((const char *)&dataSize,sizeof(size_t));  // 先发送包头
    socket->write(data);                                    // 再发送json数据(包体)

    emit ReginBtnClicked();     //  发送登录按钮点击信号
}

// 读取服务器响应
void Mainface::readServerResponse()
{
   auto Content = socket->readAll();
   buffer.append(Content);
   while(buffer.size() > sizeof(size_t))
   {
       size_t size = 0;
       memcpy(&size,buffer.data(),sizeof (size_t));

       if(buffer.size() <size + sizeof(size_t))
       {
           break;
       }

       auto data = buffer.mid(sizeof(size_t),size);
       // json解析
       QJsonDocument doc = QJsonDocument::fromJson(data);
       QJsonObject jsonObj = doc.object();

      int type = jsonObj["type"].toInt();
      qDebug()<<"type what:"<<type;

      handle = GetHandlePtr(jsonObj["type"].toInt());
      qDebug()<<"what :"<<jsonObj["type"].toInt();
      handle->MFHandle(jsonObj,this);

      buffer.remove(0,size + sizeof(size_t));

   }
}

// 注册成功
void LOGINSUCCESS::MFHandle(QJsonObject responce, Mainface *mainface)
{
    QMessageBox::information(mainface,"Tip","注册成功",QMessageBox::Yes);
}

// 注册失败
void LOGINERROR::MFHandle(QJsonObject responce, Mainface *mainface)
{
    QMessageBox::information(mainface,"Tip","注册失败",QMessageBox::Ok);
}

// 登录成功
void REGISSUCCESS::MFHandle(QJsonObject responce, Mainface *mainface)
{
    QMessageBox::information(mainface,"Tip","登录成功",QMessageBox::Yes);
    emit mainface->ReginSuccess();      // 发送登录成功信号
}

// 登录失败
void REGISERROE::MFHandle(QJsonObject responce, Mainface *mainface)
{
    QMessageBox::information(mainface,"Tip","登录失败",QMessageBox::Ok);
}

// 简单工厂
MFHandleServerptr GetHandlePtr(const int &type)
{
    qDebug()<<"GetHandlePtr type:"<<type;

    if(type == LOGIN_SUCCESS)   // 注册成功
    {
        return std::make_shared<LOGINSUCCESS>();
    }
    if(type == LOGIN_ERROR)     // 注册失败
    {
        return std::make_shared<LOGINERROR>();
    }
    if(type == REGIS_SUCCESS)   // 登录成功
    {
        return std::make_shared<REGISSUCCESS>();
    }
    if(type == REGIS_ERROR)     // 登录失败
    {
        return std::make_shared<REGISERROE>();
    }

    return nullptr;     // 处理未知类型
}








